#include "roi.h"

#include "partie.h"

GLint Roi::lid = 0;

GLint Roi::getLid() {
    return lid;
}

void Roi::calculDeplacements(bool suppr_echecs) {
    ajouterCoup(suppr_echecs, x,y,CASE_ACTUELLE);

    // A gauche
    if (x>0) {
        if (parent->LirePlateau(x-1,y) == NULL)
            ajouterCoup(suppr_echecs, x-1,y,DEPLACEMENT);
        else if (parent->LirePlateau(x-1,y)->getCouleur() != this->couleur)
            ajouterCoup(suppr_echecs, x-1,y,CAPTURE);
    }
    // A droite
    if (x<7) {
        if (parent->LirePlateau(x+1,y) == NULL)
            ajouterCoup(suppr_echecs, x+1,y,DEPLACEMENT);
        else if (parent->LirePlateau(x+1,y)->getCouleur() != this->couleur)
            ajouterCoup(suppr_echecs, x+1,y,CAPTURE);
    }
    // En bas
    if (y>0) {
        if (parent->LirePlateau(x,y-1) == NULL)
            ajouterCoup(suppr_echecs, x,y-1,DEPLACEMENT);
        else if (parent->LirePlateau(x,y-1)->getCouleur() != this->couleur)
            ajouterCoup(suppr_echecs, x,y-1,CAPTURE);
    }
    // En haut
    if (y<7) {
        if (parent->LirePlateau(x,y+1) == NULL)
            ajouterCoup(suppr_echecs, x,y+1,DEPLACEMENT);
        else if (parent->LirePlateau(x,y+1)->getCouleur() != this->couleur)
            ajouterCoup(suppr_echecs, x,y+1,CAPTURE);
    }
    // En bas à gauche
    if (x>0 && y>0) {
        if (parent->LirePlateau(x-1,y-1) == NULL)
            ajouterCoup(suppr_echecs, x-1,y-1,DEPLACEMENT);
        else if (parent->LirePlateau(x-1,y-1)->getCouleur() != this->couleur)
            ajouterCoup(suppr_echecs, x-1,y-1,CAPTURE);
    }
    // En haut à gauche
    if (x>0 && y<7) {
        if (parent->LirePlateau(x-1,y+1) == NULL)
            ajouterCoup(suppr_echecs, x-1,y+1,DEPLACEMENT);
        else if (parent->LirePlateau(x-1,y+1)->getCouleur() != this->couleur)
            ajouterCoup(suppr_echecs, x-1,y+1,CAPTURE);
    }
    // En bas à droite
    if (x<7 && y>0) {
        if (parent->LirePlateau(x+1,y-1) == NULL)
            ajouterCoup(suppr_echecs, x+1,y-1,DEPLACEMENT);
        else if (parent->LirePlateau(x+1,y-1)->getCouleur() != this->couleur)
            ajouterCoup(suppr_echecs, x+1,y-1,CAPTURE);
    }
    // En haut à droite
    if (x<7 && y<7) {
        if (parent->LirePlateau(x+1,y+1) == NULL)
            ajouterCoup(suppr_echecs, x+1,y+1,DEPLACEMENT);
        else if (parent->LirePlateau(x+1,y+1)->getCouleur() != this->couleur)
            ajouterCoup(suppr_echecs, x+1,y+1,CAPTURE);
    }

    // Roques
    // DEBUG : faire le deplacement a la main (deplacement de 2 cases impossible pour le roi) ???
    if (suppr_echecs) {    // Si on veut ignorer les echecs, on ne calcule pas les roques (sinon boucle infinie d'appels respectifs avec verifierEchec())
        if (this->couleur == BLANC) {

            // Petit roque
            // Roi : E1 -> G1 ; Tour : H1 -> F1
            // Conditions : pas de mouvement, cases vides, roi en échec nulle part
            if (parent->getRoquePB()) {
                if (parent->LirePlateau(5,0) == NULL && parent->LirePlateau(6,0) == NULL) {
                    if (!(parent->verifierEchec(couleur))) {
                        parent->setPlateau(4,0,NULL);parent->setPlateau(5,0,this);this->x=5;//parent->deplacerPiece(this, 5, 0, true);
                        if (!(parent->verifierEchec(couleur))) {
                            parent->setPlateau(5,0,NULL);parent->setPlateau(4,0,this);this->x=4;//parent->annulerDeplacement();
                            parent->setPlateau(4,0,NULL);parent->setPlateau(6,0,this);this->x=6;//parent->deplacerPiece(this, 6, 0, true);
                            if (!(parent->verifierEchec(couleur))) {
                                parent->setPlateau(6,0,NULL);parent->setPlateau(4,0,this);this->x=4;//parent->annulerDeplacement();
                                ajouterCoup(false,6,0,PETIT_ROQUE);	// suppr_echec -> false ??? DEBUG
                                cout << "PETIT ROQUE BLANC POSSIBLE" << endl;
                            }
                            else
                                parent->setPlateau(6,0,NULL);parent->setPlateau(4,0,this);this->x=4;//parent->annulerDeplacement();
                        }
                        else
                            parent->setPlateau(5,0,NULL);parent->setPlateau(4,0,this);this->x=4;//parent->annulerDeplacement();
                    }
                }
            }

            // Grand roque
            // Roi : E1 -> C1 ; Tour : A1 -> D1
            // Conditions : pas de mouvement, cases vides, roi en échec nulle part
            //if (this->nbDeplacements == 0 && parent->matriceJeu[0][0]->getNbDeplacements() == 0) {
            if (parent->getRoqueGB()) {
                if (parent->LirePlateau(3,0) == NULL && parent->LirePlateau(2,0) == NULL && parent->LirePlateau(1,0) == NULL) {
                    if (!(parent->verifierEchec(couleur))) {
                        parent->setPlateau(4,0,NULL);parent->setPlateau(3,0,this);this->x=3;//parent->deplacerPiece(this, 5, 0, true);
                        if (!(parent->verifierEchec(couleur))) {
                            parent->setPlateau(3,0,NULL);parent->setPlateau(4,0,this);this->x=4;//parent->annulerDeplacement();
                            parent->setPlateau(4,0,NULL);parent->setPlateau(2,0,this);this->x=2;//parent->deplacerPiece(this, 6, 0, true);
                            if (!(parent->verifierEchec(couleur))) {
                                parent->setPlateau(2,0,NULL);parent->setPlateau(4,0,this);this->x=4;//parent->annulerDeplacement();
                                ajouterCoup(false,2,0,GRAND_ROQUE);	// suppr_echec -> false ??? DEBUG
                                cout << "GRAND ROQUE BLANC POSSIBLE" << endl;
                            }
                            else
                                parent->setPlateau(2,0,NULL);parent->setPlateau(4,0,this);this->x=4;//parent->annulerDeplacement();
                        }
                        else
                            parent->setPlateau(3,0,NULL);parent->setPlateau(4,0,this);this->x=4;//parent->annulerDeplacement();
                    }
                }
            }

        }

        else { // NOIRS

            // Petit roque
            // Roi : E8 -> G8 ; Tour : H8 -> F8
            // Conditions : pas de mouvement, cases vides, roi en échec nulle part
            //if (this->nbDeplacements == 0 && parent->matriceJeu[7][7]->getNbDeplacements() == 0) {
            if (parent->getRoquePN()) {
                if (parent->LirePlateau(5,7) == NULL && parent->LirePlateau(6,7) == NULL) {
                    if (!(parent->verifierEchec(couleur))) {
                        parent->setPlateau(4,7,NULL);parent->setPlateau(5,7,this);this->x=5;//parent->deplacerPiece(this, 5, 0, true);
                        if (!(parent->verifierEchec(couleur))) {
                            parent->setPlateau(5,7,NULL);parent->setPlateau(4,7,this);this->x=4;//parent->annulerDeplacement();
                            parent->setPlateau(4,7,NULL);parent->setPlateau(6,7,this);this->x=6;//parent->deplacerPiece(this, 6, 0, true);
                            if (!(parent->verifierEchec(couleur))) {
                                parent->setPlateau(6,7,NULL);parent->setPlateau(4,7,this);this->x=4;//parent->annulerDeplacement();
                                ajouterCoup(false,6,7,PETIT_ROQUE);	// suppr_echec -> false ??? DEBUG
                                cout << "PETIT ROQUE NOIR POSSIBLE" << endl;
                            }
                            else
                                parent->setPlateau(6,7,NULL);parent->setPlateau(4,7,this);this->x=4;//parent->annulerDeplacement();
                        }
                        else
                            parent->setPlateau(5,7,NULL);parent->setPlateau(4,7,this);this->x=4;//parent->annulerDeplacement();
                    }
                }
            }

            // Grand roque
            // Roi : E8 -> C8 ; Tour : A8 -> D8
            // Conditions : pas de mouvement, cases vides, roi en échec nulle part
            //if (this->nbDeplacements == 0 && parent->matriceJeu[0][7]->getNbDeplacements() == 0) {
            if (parent->getRoqueGN()) {
                if (parent->LirePlateau(3,7) == NULL && parent->LirePlateau(2,7) == NULL && parent->LirePlateau(1,7) == NULL) {
                    if (!(parent->verifierEchec(couleur))) {
                        parent->setPlateau(4,7,NULL);parent->setPlateau(3,7,this);this->x=3;//parent->deplacerPiece(this, 5, 0, true);
                        if (!(parent->verifierEchec(couleur))) {
                            parent->setPlateau(3,7,NULL);parent->setPlateau(4,7,this);this->x=4;//parent->annulerDeplacement();
                            parent->setPlateau(4,7,NULL);parent->setPlateau(2,7,this);this->x=2;//parent->deplacerPiece(this, 6, 0, true);
                            if (!(parent->verifierEchec(couleur))) {
                                parent->setPlateau(2,7,NULL);parent->setPlateau(4,7,this);this->x=4;//parent->annulerDeplacement();
                                ajouterCoup(false,2,7,GRAND_ROQUE);	// suppr_echec -> false ??? DEBUG
                                cout << "GRAND ROQUE NOIR POSSIBLE" << endl;
                            }
                            else
                                parent->setPlateau(2,7,NULL);parent->setPlateau(4,7,this);this->x=4;//parent->annulerDeplacement();
                        }
                        else
                            parent->setPlateau(3,7,NULL);parent->setPlateau(4,7,this);this->x=4;//parent->annulerDeplacement();
                    }
                }
            }

        }
    }
}
